package com.zhku.controller;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.zhku.entity.User;
import com.zhku.entity.UserInfo;
import com.zhku.entity.Vaccinum;
import com.zhku.service.IUserInfoService;
import com.zhku.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 用户 前端控制器
 * </p>
 *
 * @author dewey
 * @since 2023-03-31
 */
@RestController
@RequestMapping(value = "/user")
public class UserController {

    //依赖业务层
    @Autowired
    IUserService userService;

    //依赖业务层
    @Autowired
    IUserInfoService iUserInfoService;

    //使用jackson来转换map
    ObjectMapper objectMapper = new ObjectMapper();

    //查询所有的user 的详细数据 返回
    @RequestMapping(value = "/listinfo")
    public String list(
            @RequestParam(required = true, defaultValue = "1") Integer pageNum,
            @RequestParam(required = true, defaultValue = "1") Integer pageSize,
            @RequestParam(required = false) String keyword  //关键字
    ) throws JsonProcessingException {
        // 定义一个map来存放json的键值对
        Map result = new HashMap();

        //分页查询
        /*分页构造函数
        Params:
        current – 当前页
        size – 每页显示条数*/

        //查询构造条件
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        // 成立的表达式，字段名 和数值
        queryWrapper.like(keyword != null && !keyword.equals(""), "name", keyword);
        Page<User> page = userService.page(new Page<>(pageNum, pageSize), queryWrapper);

        page.getRecords().forEach(en -> {
            UserInfo info = iUserInfoService.getById(en.getId());
            en.setUserInfo(info);
        });

        // 在结果中放一个list集合
        result.put("list", page.getRecords());
        result.put("total", page.getTotal());
        // 返回json
        return objectMapper.writeValueAsString(result);
    }

    /**
     * @description: 用来查询详细的用户，医护人员的信息
     * @author: deweyMDH
     * @param: [pageNum, pageSize, keyword]
     * @return: java.lang.String
     **/
    @RequestMapping(value = "/listinfo2")
    public String listinfo2(
            @RequestParam(required = true, defaultValue = "1") Integer pageNum,
            @RequestParam(required = true, defaultValue = "1") Integer pageSize,
            @RequestParam(required = false) String keyword, //关键词
            @RequestParam(required = false) Integer role
    ) throws JsonProcessingException {
        // 定义一个map来存放json的键值对
        Map result = new HashMap();

        //分页查询
        /*分页构造函数
        Params:
        current – 当前页
        size – 每页显示条数*/

        //查询构造条件
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        // 角色限制
        queryWrapper.notIn("role", 0);
        // 角色查询
        queryWrapper.eq(role != null && role != 0, "role", role);
        // 成立的表达式，字段名 和数值
        queryWrapper.like(keyword != null && !keyword.equals(""), "name", keyword);

        Page<User> page = userService.page(new Page<>(pageNum, pageSize), queryWrapper);
        page.getRecords().forEach(en -> {
            UserInfo info = iUserInfoService.getById(en.getId());
            en.setUserInfo(info);
        });

        // 在结果中放一个list集合
        result.put("list", page.getRecords());
        result.put("total", page.getTotal());
        // 返回json
        return objectMapper.writeValueAsString(result);
    }

    @RequestMapping(value = "/queryphone")
    public String queryPhone(String phone) throws JsonProcessingException {
        //         定义一个map来存放json的键值对
        Map result = new HashMap();

        int num = userService.count(new QueryWrapper<User>().eq("phone", phone));
        result.put("exits", num > 0);
        //回写json
        return objectMapper.writeValueAsString(result);
    }

    //查询所有的user数据返回
    @RequestMapping(value = "/list")
    public String selectAll(
            @RequestParam(required = true, defaultValue = "1") Integer pageNum,
            @RequestParam(required = true, defaultValue = "1") Integer pageSize,
            @RequestParam(required = false) String keyword  //关键词
    ) throws JsonProcessingException {
        // 定义一个map来存放json的键值对
        Map result = new HashMap();

        //分页查询
        /*分页构造函数
        Params:
        current – 当前页
        size – 每页显示条数*/

        //查询构造条件
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        // 成立的表达式，字段名 和数值
        queryWrapper.like(keyword != null && !keyword.equals(""), "name", keyword);

        Page<User> page = userService.page(new Page<>(pageNum, pageSize), queryWrapper);
        // 在结果中放一个list集合
        result.put("list", page.getRecords());
        result.put("total", page.getTotal());
        // 返回json
        return objectMapper.writeValueAsString(result);
    }

    //用户的登录查询
    @PostMapping(value = "/loginUser")
    public String loginUser(User user, String code, HttpSession session) throws JsonProcessingException {
//         定义一个map来存放json的键值对
        Map result = new HashMap();

        // 获取验证码，判断验证码是否一致
        String captcha = (String) session.getAttribute("captcha");

        if (!captcha.equals(code)) {
            result.put("ok", false);
            result.put("message", "验证码错误");
            // 以 json 格式返回信息
            return objectMapper.writeValueAsString(result);
        }

        //创建条件构造器
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        //查询条件、手机号 及密码相等 eq
        queryWrapper.eq("phone", user.getPhone());
        queryWrapper.eq("password", user.getPassword());
        //getOne
        User one = userService.getOne(queryWrapper);

        //判断数据库是否有数据
        if (one != null) {
            result.put("ok", true);
            result.put("user", one);
        } else {
            result.put("ok", false);
            result.put("message", "用户手机或者密码错误");
        }
        // 返回
        return objectMapper.writeValueAsString(result);
    }

    // 注册用户
    @PostMapping(value = "/register")
    public String register(User user, UserInfo userInfo) throws JsonProcessingException {
        //         定义一个map来存放json的键值对
        Map result = new HashMap();

        boolean info = userService.saveUserAndInfo(user, userInfo);
        if (!info) {
            result.put("message", "注册失败，请重新操作");
        }

        result.put("ok", true);
        result.put("message", "注册成功");
        return objectMapper.writeValueAsString(result);
    }

    @PutMapping(value = "/update")
    public String updateUser(User user) throws JsonProcessingException {
//         定义一个map来存放json的键值对
        Map result = new HashMap();

        boolean one = userService.updateById(user);

        //判断数据库是否有数据
        if (one != false) {
            result.put("ok", true);
            result.put("user", user);
        } else {
            result.put("ok", false);
            result.put("message", "修改用户失败");
        }
        // 返回
        return objectMapper.writeValueAsString(result);
    }

    /**
     * @description: 使用嵌套pojo，来修改user以及userinfo的信息
     * @author: deweyMDH
     * @param: [user]
     * @return: java.lang.String
     **/
    @PutMapping(value = "/updateInfo")
    public String updateInfo(User user, UserInfo userInfo) throws JsonProcessingException {
//         定义一个map来存放json的键值对
        Map result = new HashMap();

        userInfo.setUserId(user.getId());
        // updateById方法有意思的现象，它不会改那些没有值的列，只会修改有值的列
        boolean one = userService.updateById(user);
        boolean two = iUserInfoService.updateById(userInfo);

        //判断数据库是否有数据
        if (one != false && two != false) {
            result.put("ok", true);
            result.put("user", user);
        } else {
            result.put("ok", false);
            result.put("message", "修改用户失败");
        }
        // 返回
        return objectMapper.writeValueAsString(result);
    }

    @DeleteMapping(value = "/delete/{id}")
    public String deleteUser(@PathVariable(value = "id") Integer Id) throws JsonProcessingException {
//         定义一个map来存放json的键值对
        Map result = new HashMap();

        // 先删除user 表的数据
        boolean one = userService.removeById(Id);
        // 同时删除 userInfo的数据
        boolean two = iUserInfoService.removeById(Id);

        //判断数据库是否有数据
        if (one != false && two != false) {
            result.put("ok", true);
            result.put("user", Id);
        } else {
            result.put("ok", false);
            result.put("message", "删除用户错误");
        }
        // 返回
        return objectMapper.writeValueAsString(result);
    }
}
